// Defines rune types
//--------------------------------
#ifndef RUNEDATA_H
#define RUNEDATA_H
#include "item.h"

class Rune : public Item, public BIItemSymbol, public BIItemCategory, public BIItemWeight, public BIItemType {
public:
    
    Rune( int number );
    virtual ~Rune() { }

    static void RandomiseRuneNames();

protected:

    virtual bool Name( std::string* name, bool* plural, uint article ) const;
    virtual bool ItemSymbol( IO::Sym* symbol ) const;
    virtual bool ItemType( uint* type ) const;
    virtual bool ItemCategory( uint* category ) const;
    virtual bool ItemWeight( uint* weight ) const;
    virtual bool OnEaten( Creature* c );

    static std::vector< std::pair< std::string, bool > > _runeNames;
    static std::vector< Colour >      _runeColours;

private:

    int _number;

};

class SightRune : public Rune {
public:

    SightRune() : Rune( 0 ) { }
    virtual ~SightRune() { }

};

class FarRune : public Rune {
public:

    FarRune() : Rune( 1 )  { }
    virtual ~FarRune() { }

};

class InvisibleRune : public Rune {
public:

    InvisibleRune() : Rune( 2 )  { }
    virtual ~InvisibleRune() { }

};

class FireRune : public Rune, public BIFlammable {
public:

    FireRune() : Rune( 3 )  { }
    virtual ~FireRune() { }

protected:

    virtual bool Flammable( uint* flammableType ) const;

};

class LightRune : public Rune {
public:

    LightRune() : Rune( 4 )  { }
    virtual ~LightRune() { }

};

class SelfRune : public Rune {
public:

    SelfRune() : Rune( 5 )  { }
    virtual ~SelfRune() { }

};

class MatterRune : public Rune {
public:

    MatterRune() : Rune( 6 )  { }
    virtual ~MatterRune() { }

};

class DestroyRune : public Rune {
public:

    DestroyRune() : Rune( 7 )  { }
    virtual ~DestroyRune() { }

};

class ProtectRune : public Rune {
public:

    ProtectRune() : Rune( 8 )  { }
    virtual ~ProtectRune() { }

};

class KnowledgeRune : public Rune {
public:

    KnowledgeRune() : Rune( 9 )  { }
    virtual ~KnowledgeRune() { }

};

class ControlRune : public Rune {
public:

    ControlRune() : Rune( 10 )  { }
    virtual ~ControlRune() { }

};

#endif
